package threadLocal;

public class ThreadLocalTest {

    //创建ThreadLocal对象，做成 static
    public static ThreadLocal<Object> threadLocal1 = new ThreadLocal<>();
    public static ThreadLocal<Object> threadLocal2 = new ThreadLocal<>();

    //Task是一个线程类(静态内部类)
    public static class Task implements Runnable {
        @Override
        public void run() {
            Dog dog = new Dog();
            Pig pig = new Pig();
            //给threadLocal1 放入 set dog 隔山打牛
            System.out.println("Task 放入了 dog=" + dog);
            /*
                public void set(T value) {
                    //1.获取当前线程，关联到当前线程
                    Thread t = Thread.currentThread();
                    //2.通过线程对象，获取ThreadLocalMap
                    //  ThreadLocalMap是ThreadLocal类的静态内部类
                    ThreadLocalMap map = getMap(t);
                    //3.如果map不为空，就将数据(dog, pig...)放入map -key:threadLocal
                    //  -value: 要存放的数据 从源码看出一个ThreadLocal只能关联一个数据，
                    //  如果再次set，会将之前的数据替换
                    //4. 如果map为空，就创建一个和当前线程关联的ThreadLocalMap，并且将该数据放入
                    if (map != null)
                        map.set(this, value);
                    else
                        createMap(t, value);

                   //5.一个Thread中可以管理多个ThreadLocal对象(类型为ThreadLocal.ThreadLocalMap)，
                       Thread有属性table(类型为ThreadLocal.ThreadLocalMap.Entry)，当调用threadLocal.set时会将
                       k:ThreadLocal v:值 加入table 中。
                       所以每个ThreadLocal只能关联一个数据，当需要存放多个数据时，需要准备多个ThreadLocal对象
             */
            threadLocal1.set(dog);
//            threadLocal1.set(pig); //替换Thread中的属性table(类型为ThreadLocalMap的内部类Entry)中key为threadLocal1的值
            threadLocal2.set(pig);//在Thread中的table中加入: k-ThreadLocal  v-Pig对象，与threadLocal2关联
            System.out.println("在run()方法中，线程 = " + Thread.currentThread().getName());
            new T1Service().update();
        }
    }

    public static void main(String[] args) {
        //启动的一个新线程
        new Thread(new Task()).start();
    }
}
